package com.daohang361.imqq.ServerContex;

import java.util.ArrayList;

import com.daohang361.imqq.XmlLoader.InitDomParser;
import com.daohang361.imqq.encoder.InterfaceEncoder;

/** 
 	 * @author naner E-mail:likun3344@163.com 
 	 * @create time：2011-4-10 下午04:56:22 
 	 * <pre>
 	 * 用于保存应用上下文,全局变量
	 * xml启动加载项目,用于封装QQ初始化步骤，用于丰富登陆信息，此数组序列与xml文件中序列一致，如果
	 * sendtimes为2则队列加2个encoder.encoder ignore表示是否忽略此步骤必须过，必须过的标志是服务
	 * 器返回对应命令并且能够正常解码，如果为false则表示不能忽略，那么QQUSer的logintimes 就在decoder
	 * 里面前进，否则就在encoder里面前进，只管发送了.注意同一对编码解码器一般不能都让logintimes前进
	 * 或者后退,除非接收到致命异常等特殊情况。
	 *</pre>
	 */
public class ServerContex {
	/**
	 * 初始化登陆步骤编码器序列,此处后面应该修改，存放命令应该从统一的地方，此地方应该包括java文件，
	 * xml格式反射出来的虚拟类等。此处暂且如此吧。
	 */
	private static ArrayList<InterfaceEncoder> initQuery = new ArrayList<InterfaceEncoder>();
	/**
	 * 初始化登陆步骤编码器命令,此处应该作为主要的流程，流程应该只是记录需要发送什么命令，以及命令的顺序.
	 */
	private static ArrayList<Integer> initCommand = new ArrayList<Integer>();
	
	public synchronized static Integer getNowCommand(int index)
	{
		return initCommand.get(index);
	}
	public synchronized static InterfaceEncoder getNow(int index)
	{
		return initQuery.get(index);
	}
	public synchronized static void saveEncoder(InterfaceEncoder encoder)
	{
		initQuery.add(encoder);
	}
	public synchronized static void saveCommand(int command)
	{
		initCommand.add(command);
	}
	
	/**
	 * 添加初始化发送包集合
	 * @param encoders
	 */
	public synchronized static void saveEncoder( ArrayList<InterfaceEncoder> encoders)
	{
		initQuery.addAll(encoders);
	}
	public synchronized static void saveCommand( ArrayList<Integer> commandes)
	{
		initCommand.addAll(commandes);
	}
	/**
	 * 启动时加载全局设置,此处如果出现异常，则表示默认初始化xml或者dtd文件有异常，程序将不得不退出
	 *( 后期可以考虑此处异常的时候不退出程序，程序将调用系统默认java程序，defualtInit.xml规则将失效)
	 */
	public synchronized static void initLoader(){
		try {
			InitDomParser.init();
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(0);
		}
	}
	/**
	 * 获取初始化总共步骤
	 * @return
	 */
	public static int getSize()
	{
		return initQuery.size();
	}
}
